盛世集团

提交需求
*
*

*
*
*
立即提交
点击”立即提交” ,表明我理解并同意 《盛世集团科技隐私条款》

logo

    产品与服务
    解决方案
    技术支持
    合作发展
    关于盛世集团

    申请试用
      D-link DIR645 缓冲区溢出漏洞分析
      发布时间:2023-05-12 阅读次数: 1526 次
      前言

      D-Link DIR-645在实现上存在命令注入及栈缓冲区溢出漏洞 ,攻击者可利用这些漏洞任意更改内存 ,以root权限执行任意shell命令或代码。该漏洞是CGI脚本在处理authentication.cgi请求 ,将请求头的CONTENT_LENGTH值作为read函数读取文件的内容大小 ,由于该值可控 ,因此造成read函数的缓冲区溢出。
      固件模拟

      首先通过attifyos虚拟机进行环境搭建 ,attifyos虚拟机中集成了常用的固件环境模拟工具。

      attifyos虚拟机下载地址:https://pan.www.yzjiangyang.com/s/1Vracsnlt5uNbdmfYK4dp8Q  

      密码:tvoh

      DIR645固件下载地址:https://pan.www.yzjiangyang.com/s/1B7fDB4NETjdGWtlkiPULpw

      提取码:5iaz

      下载完成后 ,进入虚拟机目录/home/oit/tools/firmadyne ,执行python fat.py

      图片

      此时会要求输入所需要模拟的固件地址 ,这里我将固件放置在桌面 ,因此目录为/home/oit/Desktop/firewalks/DIR645A1_FW103RUB08.bin

      接下来会要求填写固件的品牌名 ,可任意填写

      图片

      然后便是根据要求不断填写firmadyne的用户密码 ,在attifyos1.3中 ,密码为firmadyne。

      图片

      过程中可能需要填写oit用户的密码 ,密码为attify123。最后当出现如下页面时 ,则表示固件模拟成功。

      图片

      此时访问http://192.168.0.1 ,可看到路由器登录页面

      图片
      漏洞复现

      向路由器管理系统发现如下请求













      POST /authentication.cgi HTTP/1.1Host: 192.168.0.1User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:50.0) Gecko/20100101 Firefox/50.0Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8Accept-Language: en-US,en;q=0.5Content-Type: application/x-www-form-urlencodedReferer: http://192.168.0.1/Content-Length: 7044Cookie: uid=TjnCBrkNZjConnection: close
      uid=A21G&password=AAAAAA1024*A

      返回结果如下图所示 ,造成相关服务500 ,无法访问

      图片

      而正常的请求结果如下

      图片

      请求体的内容超长导致了dir645出现了缓冲区溢出 ,从而拒绝服务。

      漏洞分析

      首先通过binwalk解压固件

      图片

      进入到路由器系统目录下 ,发现请求的authentication.cgi路径 ,实际处理文件为cgibin

      图片

      接下来对cgibin进行反编译 ,将该程序导入到ida中 ,默认进入初始函数的main函数中

      图片

      F5查看伪代码 ,可以看到main函数主要是判断请求uri ,根据不同的uri选择不同的函数进行处理

      图片

      如果为authentication.cgi ,则进入authenticationcgi_main函数处理 ,并将请求的数据作为参数值传入该函数

      图片

      进一步进入authenticationcgi_main函数

      图片

      在这个函数里 ,根据请求方式的不同 ,进入不同的程序逻辑处理。盛世集团漏洞利用poc为post方法 ,查看post相关逻辑

      图片

      可以看到 ,当为post请求时 ,读取CONTENT_LENGTH和CONTENT_TYPE的值 ,若不为空 ,则将相关参数值传入到read函数里进行读取。函数为read(v21,v70,v20)

      根据c语言的函数用法如下所示

      图片

      我们可以看到 ,该函数用于读取打开文件的内容。其中第一个参数为要读取的文件内容 ,第二个参数为读取到的内容保存的缓冲区 ,第三个参数指定所要读取文件的长度。这个函数如果使用不规范的话 ,当第三个参数指定的读取文件长度超过第二个参数所定义的缓冲区大小时 ,就造成了缓冲区溢出漏洞。

      那么在这里漏洞案例中 ,我们来看下read(v21,v70,v20) 函数所对应的这三个参数值分别是什么。

      v21=fileno(stdin) 为用户输入的值 ,即post请求体的中的body数据

      图片

      v70为函数定义的数据结构 ,大小为1024比特

      图片

      v20 = atoi(v18)= atoi(getenv(“CONTENT_LENGTH”) ,为CONTENT_LENGTH的值

      图片

      由于这里v20所代表的读取内容的长度是用户可控的 ,因此当设置CONTENT_LENGTH大于1024 ,请求体内容超长时 ,就造成了read函数出现缓冲区溢出漏洞


      盛世集团·(中国大陆)官方网站 免费试用
      盛世集团·(中国大陆)官方网站 服务热线
      盛世集团·(中国大陆)官方网站

      马上咨询

      400-811-3777

      盛世集团·(中国大陆)官方网站 回到顶部
      【网站地图】